"""
DAQ库日志系统Python绑定
封装DAQ库的日志控制接口
"""

import ctypes
from typing import Optional
from enum import IntEnum


class LogLevel(IntEnum):
    """日志等级枚举"""
    TRACE = 0       # 跟踪级别：最详细的日志信息
    DEBUG = 1       # 调试级别：调试信息
    INFO = 2        # 信息级别：一般信息
    WARN = 3        # 警告级别：警告信息
    ERROR = 4       # 错误级别：错误信息
    CRITICAL = 5    # 严重级别：严重错误信息
    OFF = 6         # 关闭级别：关闭所有日志输出


class LoggerBinding:
    """DAQ库日志系统Python绑定类"""
    
    def __init__(self, dll_path: str):
        """
        初始化日志系统绑定
        
        Args:
            dll_path: DLL文件路径
        """
        try:
            self.dll = ctypes.CDLL(dll_path)
            self._setup_logger_function_signatures()
        except OSError as e:
            raise RuntimeError(f"无法加载DLL文件 {dll_path}: {e}")
    
    def _setup_logger_function_signatures(self):
        """设置日志系统函数签名"""
        # 设置日志等级
        self.dll.DAQLibrary_SetLogLevel.argtypes = [ctypes.c_int]
        self.dll.DAQLibrary_SetLogLevel.restype = None
        
        # 获取日志等级
        self.dll.DAQLibrary_GetLogLevel.argtypes = []
        self.dll.DAQLibrary_GetLogLevel.restype = ctypes.c_int
    
    def set_log_level(self, level: LogLevel) -> None:
        """
        设置日志等级
        
        Args:
            level: 日志等级（LogLevel枚举值）
            
        Note:
            设置的日志等级将影响所有DAQ库的日志输出
            只有等于或高于设置等级的日志才会被输出
        """
        if not isinstance(level, LogLevel):
            raise ValueError("level必须是LogLevel枚举值")
        
        self.dll.DAQLibrary_SetLogLevel(level.value)
    
    def get_log_level(self) -> LogLevel:
        """
        获取当前日志等级
        
        Returns:
            当前的日志等级（LogLevel枚举值）
        """
        level_value = self.dll.DAQLibrary_GetLogLevel()
        
        try:
            return LogLevel(level_value)
        except ValueError:
            # 如果返回的值不在枚举范围内，返回OFF
            return LogLevel.OFF
    
    def set_trace_level(self) -> None:
        """设置日志等级为TRACE（最详细）"""
        self.set_log_level(LogLevel.TRACE)
    
    def set_debug_level(self) -> None:
        """设置日志等级为DEBUG"""
        self.set_log_level(LogLevel.DEBUG)
    
    def set_info_level(self) -> None:
        """设置日志等级为INFO"""
        self.set_log_level(LogLevel.INFO)
    
    def set_warn_level(self) -> None:
        """设置日志等级为WARN"""
        self.set_log_level(LogLevel.WARN)
    
    def set_error_level(self) -> None:
        """设置日志等级为ERROR"""
        self.set_log_level(LogLevel.ERROR)
    
    def set_critical_level(self) -> None:
        """设置日志等级为CRITICAL"""
        self.set_log_level(LogLevel.CRITICAL)
    
    def disable_logging(self) -> None:
        """禁用所有日志输出"""
        self.set_log_level(LogLevel.OFF)
    
    def is_level_enabled(self, level: LogLevel) -> bool:
        """
        检查指定日志等级是否启用
        
        Args:
            level: 要检查的日志等级
            
        Returns:
            True表示该等级的日志会被输出，False表示不会输出
        """
        if not isinstance(level, LogLevel):
            raise ValueError("level必须是LogLevel枚举值")
        
        current_level = self.get_log_level()
        return level.value >= current_level.value